//********************************************************************************************************
// Product Name: MapWindow.dll Alpha
// Description:  Low level interfaces that allow separate components to use objects that are defined
//               in completely independant libraries so long as they satisfy the basic interface requirements.
//********************************************************************************************************
// The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); 
// you may not use this file except in compliance with the License. You may obtain a copy of the License at 
// http://www.mozilla.org/MPL/ 
//
// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF 
// ANY KIND, either express or implied. See the License for the specificlanguage governing rights and 
// limitations under the License. 
//
// The Original Code is MapWindow.dll
//
// The Initial Developer of this Original Code is Ted Dunsford. Created in August, 2007.
// 
// Contributor(s): (Open source contributors should list themselves and their modifications here). 
//
//********************************************************************************************************
using System;
using System.Collections.Generic;
using System.Text;
using MapWindow.Main;
using MapWindow.Data;
namespace MapWindow.Drawing
{
    /// <summary>
    /// Constructor
    /// </summary>
    public interface IMapLayerCollection : IEventList<IMapLayer>, IRenderable2D, IMapLayer
    {

        #region Methods

        /// <summary>
        /// This overload automatically constructs a new MapLayer from the specified
        /// feature layer with the default drawing characteristics and returns a valid
        /// IMapLayer which can be further cast into a MapPointLayer, MapLineLayer or
        /// a MapPolygonLayer, depending on the data that is passed in.
        /// </summary>
        /// <param name="FeatureLayer">Any valid IFeatureLayer that does not yet have drawing characteristics</param>
        /// <returns>A newly created valid implementation of IMapLayer which at least gives a few more common
        /// drawing related methods and can also be cast into the appropriate Point, Line or Polygon layer.</returns>
        IMapLayer Add(IFeatureLayer FeatureLayer);
        
        /// <summary>
        /// Returns all the layers with point features in a list of IMapPointLayers
        /// returns the values already cast as MapPointLayers.
        /// </summary>
        List<IMapPointLayer> GetPointLayers();

        /// <summary>
        /// Returns the N'th PointLayer where N is the index where only point layers are counted
        /// </summary>
        /// <param name="N"></param>
        /// <returns></returns>
        IMapPointLayer GetPointLayer(int N);
        
        /// <summary>
        /// Gets the total count of Point layers in this collection
        /// </summary>
        int NumPointLayers
        {
            get;
        }


         /// <summary>
        /// Returns a list of IMapLineStringLayer interfaces representing each of the current MapLayers that happens
        /// to specifically be a LineStringLayer.  The index values will probably not match the index value in 
        /// the complete list of layers.
        /// </summary>
        List<IMapLineStringLayer> GetLineStringLayers();
        
        /// <summary>
        /// Returns the N'th LineStringLayer where N is the index if only LineString layers are counted
        /// </summary>
        /// <param name="N">The integer index specifying the LineString Layer</param>
        /// <returns></returns>
        IMapLineStringLayer GetLineStringLayer(int N);

        /// <summary>
        /// Gets the total count of LineString layers in this collection
        /// </summary>
        int NumLineStringLayers
        {
            get;
        }

        /// <summary>
        /// Gets the total count of Polygon layers in this collection
        /// </summary>
       int NumPolygonLayers
        {
            get;
        }
        /// <summary>
        /// Returns a list of IMapPolygonLayer interfaces representing each of the current MapLayers that happens
        /// to specifically be a LineStringLayer.  The index values will probably not match the index value in 
        /// the complete list of layers.
        /// </summary>
        List<IMapPolygonLayer> GetPolygonLayers();
       

        /// <summary>
        /// Returns the N'th IMapPolygonLayer where N is the index if only LineString layers are counted
        /// </summary>
        /// <param name="N">The integer index specifying the LineString Layer</param>
        /// <returns></returns>
        IMapPolygonLayer GetPolygonLayer(int N);
      





        #endregion 


    }
}
